ソフトウェアアーキテクチャの基礎輪読会 11章
日付:2023/11/14
章:パイプラインアーキテクチャ
調査者:kiri.icon
章のまとめ
どんな内容が書かれているか?
要約
パイプラインアーキテクチャの基本的な考え方、構成
メリット
シンプルさ、コストの低さ
モジュール性が高い
デメリット
スケールのしづらさ
パイプラインアーキテクチャ
別名: 「パイプとフィルター」アーキテクチャ
応用を参照
関数型言語の概念とこのアーキテクチャは類似性がある
トポロジー
パイプとフィルターから構成される
図11-1参照
一方向かつポイントツーポイント方式で通信が行われる
パイプ
フィルター間の通信チャンネルを形成する
一方向かつポイントツーポイントとなっており、あるソースからの入力を他のソースに出力する
フィルター
他のフィルターからは独立していて、一般にステートレス
1つのフィルターは1つのタスクのみを行う
4種類のフィルターが存在する
プロデューサー(ソース)
処理の開始点。出力のみ
トランスフォーマー(変換器)
入力を受け、オプションでデータを変換し、結果を出力パイプに送る
map
テスター
入力を受け、基準について検査し、検査に基づく出力を生成する
reduceに似たもの
コンシューマー
パイプラインフローの終了点
結果をDBに永続化したり、UIに表示したりする
「More Shell, Less Egg」のお話
Donald Knuthが、テキストファイルを読み込み、n個の単語を出現回数順にソートし、ソートした単語と頻度をともに印刷するプログラムを書くように依頼された。
Donald KnuthはPascalで10ページ以上にも渡るプログラムを書いた。
その後Doug McllroyがTwitterの投稿に収まる程度のシェルスクリプトを実装した。
パイプとフィルターのシンプルさエレガントさが評価された
事例
さまざまなサービスのテレメトリ情報がApache Kafkaにストリーミング経由で送信されている例でパイプラインアーキテクチャの使い方を考えてみる。 図11-2参照
1. Service Info Capture(プロデューサー)
Kafkaのトピックをサブスクライブし、サービス情報を受信。
Kafkaからストリーミングデータを受信する方法にのみ関心がある。
2. Duration Filter(テスター)
Service Info Captureから受け取ったデータを処理。
Kafkaからのデータがサービスリクエストの継続時間に関連しているか判断。
データを修飾し、必要に応じて次のパイプにルーティングすることにのみ関心がある。
3. Duration Calculator(トランスフォーマー)
データがサービスリクエストの継続時間に関連している場合、Duration Filterからデータを受け取る。
サービスの継続時間を計算する。
4. Uptime Filter(テスター)
データがサービスリクエストの継続時間に関連していない場合、Duration Filterから受け取る。
データが連続稼働時間に関連しているかをチェック。
5. Uptime Calculator(トランスフォーマー)
データが連続稼働時間に関連している場合、Uptime Filterから受け取る。
サービスの連続稼働時間を計算する。
6. Database Output(コンシューマー)
トランスフォーマー(Duration CalculatorやUptime Calculator)から変更されたデータを受け取る。
MongoDBにデータを永続化する。
特徴
拡張性の高さ
待ち時間のようなメトリクスが欲しければ、Uptime Filterのあとにテスターフィルターを追加するだけで良い
それぞれが特定のタスクに集中している
関心の分離
アーキテクチャ特性の評価
table:pypeline
分割タイプ 技術
量子数 1(モノリシック)
デプロイ容易性 ☆☆
弾力性 ☆
進化性 ☆☆☆
耐障害性 ☆
モジュール性 ☆☆☆
全体的なコスト(の安価さ) ☆☆☆☆☆
パフォーマンス ☆☆
信頼性 ☆☆☆
スケーラビリティ ☆
シンプルさ ☆☆☆☆☆
テスト容易性 ☆☆☆
優れている点
モジュール性と組み合わさったシンプルさとコストの低さ
シンプルで、構築・維持のためのコストが比較的低い(モノリシックなため)
モジュール性は、フィルターとアダプターの間で関心事を分離することで達成される
デプロイ容易性とテスト容易性は平均的だが、モジュール性のレベルが高いため、レイヤードアーキテクチャよりわずかに高め
依然モノリシックなため、少量の変更で再デプロイ等の問題点は抱えている 信頼性
劣る点
弾力性とスケーラビリティ
モノリス中の特定の機能をスケールさせるのは複雑な設計技術が必要となる
耐障害性
一つ落ちると全部落ちる
naoya.icon これはまずいw
復旧に2分〜15分ぐらいかかる
応用
「More Shell, Less Egg」を解読
テキストファイルを読み込み、n個の単語を出現回数順にソートし、ソートした単語と頻度をともに印刷するプログラム
naoya.icon 確かに、コマンドごとに明確に分かれてるね
code:moreShellLessEgg
tr -cs A-Z a-z '\n' | // アルファベット以外の文字を改行に変換し、単語を一行ごとに分割
tr A-Z a-z | // 大文字を小文字に変換
sort | // 単語をアルファベット順に並び替える
uniq -c | // 連続する重複する単語をカウントし、各単語の出現回数を表示
sort -rn | // 数値の降順でソートし、最も頻繁に使用される単語を上に表示する
sed ${5}q // 引数で指定された数(${5})だけの行を表示し、それ以降を無視します。
例文: "The quick brown fox jumps over the lazy dog."
2 the
1 quick
1 over
1 lazy
1 jumps
質疑応答